const int maxn=110;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct P{
    int x,y;
    bool operator<(const P& B)const{
        if(x==B.x) return y<B.y;
        return x<B.x;
    }
};
bool cmp(vector<int>v1,vector<int>v2){
    if(v1[0]==v2[0]) return v1[1]<v2[1];
    else return v1[0]<v2[0];
}
class Solution {
public:
    typedef pair<pair<int,int>,int>Pii;
    unordered_map<int,bool>map1[maxn][maxn];
    queue<Pii>que;
    vector<vector<int>> bicycleYard(vector<int>& po, vector<vector<int>>& te, vector<vector<int>>& ob) {
        vector<vector<int>>ans;
        int n=te.size(); int m=te[0].size();
        que.push({{po[0],po[1]},1});
        while(!que.empty())
        {
            Pii now=que.front();que.pop();
            int nx=now.first.first;int ny=now.first.second;int nval=now.second;
            for(int i=0;i<4;i++){
                int tx=nx+dx[i];int ty=ny+dy[i];
                if(tx<0||tx>=n||ty<0||ty>=m) continue;
                int tval=nval+te[nx][ny]-te[tx][ty]-ob[tx][ty];
                if(tval<=0) continue;
                if(map1[tx][ty].count(tval)) continue;
                if(tval==1){
                    if(tx!=po[0]||ty!=po[1]){
                        vector<int>v;
                        v.push_back(tx);v.push_back(ty);
                        ans.push_back(v);
                    }
                }
                map1[tx][ty][tval]=1;
                que.push({{tx,ty},tval});
            }
        }
        vector<P>res;
        for(int i=0;i<ans.size();i++){
            res.push_back({ans[i][0],ans[i][1]});
        }
        sort(res.begin(),res.end());
        for(int i=0;i<res.size();i++){
            vector<int>v;
            v.push_back(res[i].x);v.push_back(res[i].y);
            ans.push_back(v);
        }
        return ans;
    }
};
